/* 
axios二次封装
1. 配置基础路径和超时时间   axios.create()
2. 显示请求加载进度   请求拦截器/响应拦截器
3. 自动携带token请求头  请求拦截器
4. 请求成功返回响应体数据  响应拦截器成功回调
5. 请求失败提示错误  响应拦截器失败回调
6. 401错误时, 自动跳转到登陆页面 响应拦截器失败回调
*/
import axios from 'axios'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import {getToken, removeToken, removeUser} from '../utils/storageUtils'

/* 1. 配置基础路径和超时时间 */
const request = axios.create({
  // baseURL: 'http://localhost:8082',
  // baseURL: 'http://localhost:4000/api',
  baseURL: '/api', // 不用写基础url, 请求的基础url就是当前前台项目运行的服务地址
  timeout: 20000,
})

// 添加请求拦截器
request.interceptors.request.use((config) => {
  /* 2. 显示请求加载进度 */
  NProgress.start()

  /* 3. 自动携带token请求头 */
  const token = getToken()
  if (token) {
    config.headers['token'] = token
  }

  return config
})

// 添加响应拦截器
request.interceptors.response.use(
  response => {
    /* 2. 结束请求加载进度 */
    NProgress.done()

    /* 4. 请求成功返回响应体数据 */
    return response.data
  },
  error => {
    /* 2. 结束请求加载进度 */
    NProgress.done()

    /* 5. 请求失败提示错误 */
    alert(error.message)
    /* 6. 401错误时, 自动跳转到登陆页面 */
    const status = error.response.status
    if (status===401) {
      // 清除保存的数据
      removeToken()
      removeUser()
      // 跳转到login页面
      window.location = '/login.html'
    }

    throw error
  }
)

// 暴露 request
export default request